/**泛型
介绍
软件工程中，我们不仅要创建一致的定义良好的API，同时也要考虑可重用性。 组件不仅能够支持当前的数据类型，同时也能支持未来的数据类型，这在创建大型系统时为你提供了十分灵活的功能。
在像C#和Java这样的语言中，可以使用泛型来创建可重用的组件，一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。*/

//使用泛型变量
function identityF<T>(arg: T): T {
  return arg;
}

function logging<T>(arg:T[]):T[]{
  return arg;
}

function logging2<T>(arg: Array<T>): Array<T>{
  console.log(arg.length);
  return arg;
}


//泛型类型
function identity3<T>(arg:T):T{
  return arg;
}
//可以使用带有调用签名的对象字面量来定义泛型函数
let myIndentity:{<T>(arg:T):T}=identity3;

//第一个泛型接口了。 我们把上面例子里的对象字面量拿出来做为一个接口：
interface GenericIdentiyFN{
  <T>(arg:T):T;
}
function identity4<T>(arg:T):T{
  return arg;
}
let myIndentty:GenericIdentiyFN = identity4;

interface GenericIdentityFn<T> {
  (arg: T): T;
}
let myIdentity: GenericIdentityFn<number> = identity4;
